iT邦幫忙

2024 iThome 鐵人賽

DAY 5
0

愉快的新手村已經結束了,是時候該進入進階一點的內容了XD

進度

今天會仔細地介紹 Discord BOT 的權限設定。

Discord BOT 權限

在前幾天的文章,我都盡量輕描淡寫地帶過有關 Discord BOT 權限設定的部分,因為這邊可以討論的東西其實不少。

「權限」是 Discord 與其它通訊軟體的其中一個差異,同時也是 Discord 的特色之一。伺服器管理者可以給予其他伺服器成員「身分組」,身分組代表的就是「權限」,不同身分組的人可以做的事情或是查看的內容是不相同的。這部分的應用就有很多,例如:

  1. 首次加入伺服器的成員只能在大廳,只有在同意規則後,才授予使用其他頻道的權力。
  2. 有報名特定課程的人,才能獲取該課程的身分組,使用該課程專屬的頻道。(這樣開課的人就不用每開一個新課程就創立新伺服器,在管理上更方便)

對 Discord BOT 來說,它應該也需要有身分組,好讓伺服器管理者可以去控制它的權限。而這部分,Discord 都幫忙處理好了。在我們邀請 Discord BOT 進入伺服器的時候,就已經自動建立和授予身分組給 Discord BOT 了 (身分組名稱預設使用 Discord BOT 名稱)。

Discord BOT 身分組

接下來,讓我們來查看一下 Discord BOT 的身分組設定與它的權限。

身分組的設定在伺服器設定中。

進入「身分組」分頁後,就可以開始設定身分組。此時,我們可以看到的確已經有一個與 Discord BOT 名稱相同的身分組了。

點擊進入 Discord BOT 身分組後,就可以編輯設定。

如果要修改權限,就要進入「整合」分頁。

下面可以看到先前 (Day 02) 所設定的權限 (當初是直接設為管理者)。

設定 Discord BOT 權限的時機

回到正題,在前幾天的文章中,有關 Discord BOT 權限的設定一共有三個地方:

  1. 註冊 BOT (Day 02)
    • 在 Privileged Gateway Intents 打開了三個開關
      • Presence Intent
      • Server Members Intent
      • Message Content Intent
  2. 加入伺服器 (Day 02)
    • 伺服器管理者會看到這個 Discord BOT 要求的權限,並同意授權
  3. 操作 Discord BOT (Day 03)
    • 建立 Client 物件時,需要參數 intents

相信第二點應該挺好理解的,就跟平時使用第三方登入 (e.g. Google 登入) 來註冊帳號一樣,會跳出提示說網站需要取得某某資料的權限,要求同意授權。因此,接下來來討論一下第一、三點都有出現的 intents。

意圖 (intents)

有關「intents」的中文翻譯我是參考自 Discord 的 Developer Help Center 內的文章

我們一般所謂的「意圖 (intents)」,完整一點的稱呼應該是「閘道意圖 (gateway intents)」。

在 Discord,「意圖」是很重要的設定,它的概念跟「權限」差不多,只有擁有意圖的 Discord BOT,才能取得對應的資料。因此,Discord 要求開發者在操作 Discord BOT 時,需要設定意圖。而意圖一共有兩種,分別是:

  • 標準意圖 (standard intents)
  • 特權意圖 (privileged intents)

標準意圖 (standard intents)

標準意圖是可以隨意設定的,只需要在操作 Discord BOT 時設定好就,不需要再做額外的事情。如果是使用 default 的 intent,就已經把所有標準意圖都設定好了。

intents = discord.Intents.default()

特權意圖 (privileged intents)

特權意圖是用來限制查看敏感資訊用的,不只要在操作 Discord BOT 時設定,還需要在 Discord Developers 上手動打開開關。如果沒有打開,Discord BOT 一樣是拿不到資料的。

上面的開關一共有三個,包含:

  1. Presence Intent:成員狀態更新事件
  2. Server Members Intent:伺服器成員資料
  3. Message Content Intent:訊息內容

簡單測試 privileged intents 的重要性

接下來我們簡單測試看看,如果把 Message Content Intent 關掉,Quickstart 範例程式會有什麼變化?

為了方便 Demo,我們稍微調整一下,加了兩行 print

# day05.py

import discord

intents = discord.Intents.default()
intents.message_content = True

client = discord.Client(intents=intents)

@client.event
async def on_ready():
    print(f'We have logged in as {client.user}')

@client.event
async def on_message(message):
    if message.author == client.user:
        return

    await message.channel.send("收到訊息了!")
    if message.content.startswith('$hello'):
        await message.channel.send('Hello!')
    
    await message.channel.send("做完所有該做的事了!")

client.run('your token here')

首先,我們先來看看正常情況下的效果 (有打開 Message Content Intent 開關)。

結果,在啟動時,就直接被擋下來了XD

沒關係,還有另一個做法,只要先啟動好再關閉 Message Content Intent 開關就好了~

先來看一下關閉之前的效果:

關閉之後:

關閉之後,就 Discord BOT 就不回傳 Hello 了。因此,根據測試結果可以知道:

  1. 啟動 Discord BOT 時會檢查 intents 是否沒問題
  2. 把 Message Content Intent 關掉的話,雖然仍然可以監聽到傳送訊息的事件,但由於拿不到訊息內容,所以永遠無法觸發在 Quickstart 中所設定的回應。

    與把 intents.message_content = True 註解掉的效果相同

我需要什麼特權意圖?

前面文章不停地強調意圖的設定很重要,但要如何知道某個功能需要什麼意圖?是否屬於特權意圖?

當然,只要閉上眼睛把 Discord Developers 上的三個特權意圖開關都打開就沒這個問題了

discord.py 在文件中有整理各個操作所需要的特權意圖,如果想要使用做上面列出的功能,就要記得去確認是否有把對應的開關打開。

至於標準意圖,其實在 discord.py 的 API 文件中都會提到,大家在開發的時候記得去文件查一下就好,後續我們的範例也都會包含到意圖的設定,不用擔心XD

小結

今天我們介紹了 Discord BOT 各種有關權限的設定,包含了身分組、意圖 (intent)。

祝大家中秋節愉快~
/images/emoticon/emoticon61.gif


上一篇
[Day 04] 第一個 Discord BOT (三):與 BOT 互動
下一篇
[Day 06] 觸發條件 (一):事件
系列文
用 Python 打造你的 Discord BOT6
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言